package cn.kgc.springcloud.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author mosin
 * date 2022/1/3
 * @version 1.0
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    Logger logger = LoggerFactory.getLogger(getClass());
    @GetMapping("/u1")
    public String test01(){
        logger.info("用户业务调用成功!");
        return "user Service invoke ok";
    }

    @GetMapping("/u2")
    public String test02(){
        logger.info("用户业务调用成功!");
        // 创建发送http请求的客户端对象  浏览器
        RestTemplate rest = new RestTemplate();
        //发送http请求  第一个参数： 请求url地址  第二个参数： 响应的数据类型  类类型
         String result = rest.getForObject("http://localhost:8089/o1", String.class);
        return "user Service invoke ok :: "+result;
    }


    @GetMapping("/u3")
    public String test03(){
        logger.info("用户业务调用成功!");
        // 创建发送http请求的客户端对象  浏览器
        RestTemplate rest = new RestTemplate();
        //发送http请求  第一个参数： 请求url地址  第二个参数： 响应的数据类型  类类型
        String result = rest.getForObject(getRandomUrl()+"/o1", String.class);
        return "user Service invoke ok :: "+result;
    }


    @GetMapping("/u4")
    public String test04(){
        logger.info("用户业务调用成功!");
        // 创建发送http请求的客户端对象  浏览器
         RestTemplate rest = new RestTemplate();
        //发送http请求  第一个参数： 请求url地址  第二个参数： 响应的数据类型  类类型
       // String result = rest.getForObject("http://"+getRandomUrl()+"/o1", String.class);
        return "user Service invoke ok :: ";
    }

    @GetMapping("/u5")
    public String test05(){
        logger.info("用户业务调用成功!");
        // 创建发送http请求的客户端对象  浏览器
        RestTemplate rest = new RestTemplate();
       //默认的负载均衡策略  轮询
        ServiceInstance order = loadBalancerClient.choose("ORDERSCLIENT");
        URI uri = order.getUri();
        //发送http请求  第一个参数： 请求url地址  第二个参数： 响应的数据类型  类类型
         String result = rest.getForObject(uri.toString()+"/o1", String.class);
        return "user Service invoke ok :: "+result;
    }

    //获取随机的ip地址  随机策略
    public String getRandomUrl(){

        // ArrayList<String> urls = new ArrayList<>();
        // urls.add("localhost:8089");
        // urls.add("localhost:8090");
        // urls.add("localhost:8091");

        //获取服务名称下的可用节点
        List<ServiceInstance> orders= discoveryClient.getInstances("ORDERSCLIENT");
        //遍历节点
        // orders.forEach(order->{
        //     logger.info("port: {} uri: {}",order.getPort(),order.getUri());
        // });

        Random random = new Random();
        int i = random.nextInt(orders.size());
        ServiceInstance serviceInstance = orders.get(i);
        URI uri = serviceInstance.getUri();
        logger.info(uri.toString());
        return  uri.toString();
    }


}
